package manejadores;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import censo.db;

import entidades.Coordenadas;
import entidades.Dispositivo;
import entidades.Gps;
import manejadores.ManejadorDispositivos;

public class ManejadorGps {
	private Gps gps;
	private db conexion = null;
	
	
	public Gps getGps() {
		return gps;
	}

	public void setGps(Gps gps) {
		this.gps = gps;
	}

	public db getConexion() {
		return conexion;
	}

	public void setConexion(db conexion) {
		this.conexion = conexion;
	}

	public ManejadorGps(db conexion) {
		super();
		this.conexion = conexion;
	}

	public ManejadorGps(Gps gps, db conexion) {
		super();
		this.gps = gps;
		this.conexion = conexion;
	}

	public boolean Add(Gps gps) throws SQLException {
		boolean ret = false;
		ManejadorDispositivos MD = new ManejadorDispositivos(conexion);
		String cedula = "-1";
		if (MD.Find(gps.getImei())) {
			Dispositivo dispositivo = MD.getDispositivo();
			cedula = dispositivo.getRecurso();
		}
		String sql = "insert into gps (imei,latitud,longitud,recurso,fecha_sistema) values (?,?,?,?,sysdate())";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, gps.getImei());
		pst.setString(2,gps.getLatitud());
		pst.setString(3, gps.getLongitud());
		pst.setString(4, cedula);
		
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			ret = true;
		}
		
		return ret;
	}
	
	public boolean UltimaCoordRecursoHoy (String recurso) throws SQLException {
		boolean ret = false;
		String sql = "select latitud,longitud,fecha_sistema from gps where fecha_sistema = (select max(g.fecha_sistema) from gps g where g.recurso=? and date(fecha_sistema) = current_date() ) and recurso = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, recurso);
		pst.setString(2, recurso);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			gps = new Gps();
			gps.setLatitud(rs.getString("latitud"));
			gps.setLatitud(rs.getString("longitud")) ;
			gps.setFecha(rs.getString("fecha_sistema"));
			ret = true;
		}
		
		return ret;
	}
	
	public boolean CoordenaRecursoFecha(String recurso, String fecha_max) throws SQLException {
		boolean ret = false;
		String sql = "select latitud,longitud,fecha_sistema " +
				"from gps " +
				"where fecha_sistema = " +
					"(select max(g.fecha_sistema) " +
					"from gps g " +
					"where g.recurso=? " +
					"and fecha_sistema <= ? ) " +
					"and recurso = ? ";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, recurso);
		pst.setString(2, fecha_max);
		pst.setString(3, recurso);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			gps = new Gps();
			gps.setLatitud(rs.getString("latitud"));
			gps.setLatitud(rs.getString("longitud")) ;
			gps.setFecha(rs.getString("fecha_sistema"));
			ret = true;
		}
		
		return ret;
	}
	
	
	
	public ArrayList<Coordenadas> RutaHoy(String recurso) throws SQLException {
		ArrayList<Coordenadas> lista = new ArrayList<Coordenadas>();
		
		String sql = "select fecha_sistema,latitud,longitud from gps where imei=? and date(fecha_sistema) = current_date() order by fecha_sistema";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, recurso);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			Coordenadas coordenada = new Coordenadas(rs.getString("latitud"),rs.getString("longitud"),rs.getString("fecha_sistema"));
			lista.add(coordenada);
		}
		return lista;
		
	}
	
	public ArrayList<Coordenadas> RutaDate(String recurso, String fecha) throws SQLException {
		ArrayList<Coordenadas> lista = new ArrayList<Coordenadas>();
		String sql = "select fecha_sistema,latitud,longitud from gps where recurso=? and date(fecha_sistema) = ? order by fecha_sistema";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, recurso);
		pst.setString(2, fecha);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			Coordenadas coordenada = new Coordenadas(rs.getString("latitud"),rs.getString("longitud"),rs.getString("fecha_sistema"));
			lista.add(coordenada);
		}
		return lista;
	}
	public ArrayList<Coordenadas> UbicacionActualRecurso () throws SQLException {
		ArrayList<Coordenadas> lista = new ArrayList<Coordenadas>();
		String sql = "select g.recurso, g.latitud,g.longitud,g.fecha_sistema,r.nombre " +
				"from gps g,personal r " +
				"where fecha_sistema = (select max(h.fecha_sistema) " +
				"from gps h where h.recurso=g.recurso " +
				"and date(h.fecha_sistema) = current_date() ) " +
				"and g.recurso = r.codigo";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		ResultSet rs = conexion.Query(pst);
		while (rs.next()) {
			Coordenadas c = new Coordenadas();
			c.setLatitud(rs.getString("latitud"));
			c.setLongitud(rs.getString("longitud"));
			c.setFecha(rs.getString("fecha_sistema"));
			c.setPersonal(rs.getString("recurso"));
			c.setNombre(rs.getString("nombre"));
			lista.add(c);
		}
		
		return lista;
	}
}
